package com.school.sports.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.school.sports.dto.UserDTO;
import com.school.sports.entity.LoginInfo;
import com.school.sports.entity.User;

import java.util.List;

/**
 * 用户服务接口
 */
public interface UserService extends IService<User> {

    /**
     * 用户注册
     * @param user 用户信息
     * @return 注册结果
     */
    boolean register(User user);

    /**
     * 用户登录
     * @param user 用户信息
     * @return 登录信息
     */
    LoginInfo login(User user);

    /**
     * 分页查询用户列表
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @param user 查询条件
     * @return 分页结果
     */
    IPage<User> getUserPage(Integer currentPage, Integer pageSize, User user);

    /**
     * 根据ID查询用户详情（包含角色信息）
     * @param userId 用户ID
     * @return 用户详情
     */
    User getUserById(Long userId);

    /**
     * 更新用户信息
     * @param user 用户信息
     * @return 更新结果
     */
    boolean updateUser(User user);

    /**
     * 删除用户（逻辑删除）
     * @param userId 用户ID
     * @return 删除结果
     */
    boolean deleteUser(Long userId);

    /**
     * 批量删除用户
     * @param userIds 用户ID列表
     * @return 删除结果
     */
    boolean batchDeleteUsers(List<Long> userIds);

    /**
     * 修改用户状态
     * @param userId 用户ID
     * @param isActive 是否激活
     * @return 修改结果
     */
    boolean updateUserStatus(Long userId, Boolean isActive);

    /**
     * 重置用户密码
     * @param userId 用户ID
     * @param newPassword 新密码
     * @return 重置结果
     */
    boolean resetPassword(Long userId, String newPassword);

    /**
     * 检查用户名是否存在
     * @param username 用户名
     * @return 存在返回true
     */
    boolean checkUsernameExists(String username);

    /**
     * 批量导入用户
     * @param users 用户列表
     * @return 导入结果
     */
    int batchImportUsers(List<User> users);

    /**
     * 根据角色ID查询用户列表
     * @param roleId 角色ID
     * @return 用户列表
     */
    List<User> getUsersByRoleId(Integer roleId);

    /**
     * 分页查询用户信息（包含角色信息）
     * 使用优化的JOIN查询避免N+1问题
     *
     * @param page 分页参数
     * @param realName 真实姓名（可选）
     * @param roleId 角色ID（可选）
     * @param isActive 是否激活（可选）
     * @param college 学院（可选）
     * @return 分页结果
     */
    IPage<UserDTO> getUserPageWithRole(
            Page<UserDTO> page,
            String realName,
            Integer roleId,
            Boolean isActive,
            String college
    );

    /**
     * 根据真实姓名模糊查询用户（包含角色信息）
     * 使用优化的索引查询
     *
     * @param page 分页参数
     * @param realName 真实姓名
     * @return 分页结果
     */
    IPage<UserDTO> searchUsersByRealName(Page<UserDTO> page, String realName);

    /**
     * 根据用户ID查询用户详细信息（包含角色信息）
     *
     * @param userId 用户ID
     * @return 用户详细信息
     */
    UserDTO getUserDetailsById(Long userId);
}
